https://github.com/luikore/nyara
大致功能是相当于 eventmachine + thin + rack + sinatra + 0.5 个 padrino
弄了一周多,差不多 5k 行了,功能测试文档都未完整先扔了个 pre 占坑,仅限 OSX/BSD/Linux 和 Ruby 2.0+, 暂时只对跑 hello world 有信心...
require 'nyara'
get '/' do
send_string 'hello world'
end
hello world 在我的机器上
ab -c 20 -n 8000 http://127.0.0.1:3000/
可以有 6k-7k 的 TPS (默认响应带了一些 nosniff 之类的 header, 如果去掉是能上万的...), 等功能完备后再整 real world benchmark.
6-27 更新 manual https://github.com/luikore/nyara/wiki/Manual
2014-1-3 更新 obsolete 不更新了
别优化半天,才和 Erlang 不优化一样快
http://www.erlang-factory.com/upload/presentations/658/jlouis-euc-2012.pdf
Some libraries are extremely complex type-wise After 2 months of tuning on and off I went back to Erlang I Unoptimized Erlang version as fast as Combinatorrent in practice
试试对比 Elixir 的 web framework https://github.com/elixir-lang/dynamo
# Run this app from Dynamo root with:
#
# mix run -r examples/hello_world.exs --no-halt
#
defmodule HelloWorld do
use Dynamo
use Dynamo.Router
config :dynamo, compile_on_demand: false
config :server, port: 3030
get "/" do
conn.resp_body("Hello World!")
end
end
HelloWorld.start_link
HelloWorld.run
赞的方式有两种,一种是点一下主题帖右下角的 Hart 标记,另外一种是回帖表达对楼主的敬仰之情,通常做到其中一点就足够了,两点都做到的话,就更加难能可贵了,比如我,呵呵。
#20 楼 @bhuztez 但是 2k 和 5k 有区别啊
nyara 要做的东西是 exploit Fiber... 例如下面的例子,view 布局是结构化的,但渲染是顺序可中断的
controller:
view = stream 'posts/index', layout: 'layout'
view.resume # 发送 head, 执行到 index.slim 的第一个 Fiber.yield
@ext_result = visit google # 调外网服务之类的很慢的, 等待时 queue 会激活其他 Fiber
view.resume # 执行到 index.slim 的第二个 Fiber.yield 并把这个东西前面的内容发到客户端
5.times do
sleep 1 # sleep 是个 helper, 沉睡当前 Fiber 而不是进程/线程, 所以就不用定时器了
view.resume # 执行到 index.slim 的下一个 Fiber.yield
end
view.end
平白无奇的 layout.slim
html
head
script ...
link ...
body
== yield
footer ...
用 Fiber.yield 加了插入点的 index.slim
...
- Fiber.yield
= @ext_result # 注意渲染 head 的时候这个东西还不存在
- Fiber.yield
- 10.times do
= "sanchi!"
= "pinchi!"
Fiber.yield
就是类似 em-synchrony 完全不用 callback, 但是比 em-synchrony 快,而且不需要 timer 相关的 API 了
如果在 libuv 之类的东西上做,像写 outbound data 之类的还是会多产生很多复制,而且实现的复杂度降不下来。结合 fiber 做程序要简单很多。简单就是健壮和速度...
求 erlang 版做法
#21 楼 @luikore Erlang 你按顺序写就可以了,因为解释器是 preemptive 的
感觉你这个和 Twisted 自带的没啥区别
http://twistedmatrix.com/documents/current/web/howto/twisted-templates.html
你可以限制 BEAM 只用一个核心的
To make a fault-tolerant system you need at least two computers
-- http://www.esug.org/data/ESUG2006/pres/erlang-smalltalkconference.pdf
gem install nyara --no-ri --no-rdoc ERROR: Could not find a valid gem 'nyara' (>= 0) in any repository ERROR: Possible alternatives: nyaa, yara
怎么装?
$ ab -n 10000 -c 100 http://127.0.0.1:3000/
Concurrency Level: 100
Time taken for tests: 2.120 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 2280000 bytes
HTML transferred: 210000 bytes
Requests per second: 4717.32 [#/sec] (mean)
Time per request: 21.198 [ms] (mean)
Time per request: 0.212 [ms] (mean, across all concurrent requests)
Transfer rate: 1050.34 [Kbytes/sec] receive
#34 楼 @luikore 所以默认要关掉 session,这样做 bm 的时候优势就大了..
PS. 看到 twitter 上 camping 的维护者对 Rails4 的加密 session 的吐槽:
we had encrypted session cookies in Camping 5 years ago, but removed it because it's just a silly idea https://twitter.com/judofyr/status/316915841868369922
不过好像没提到加密 session,都是在说签名
做隐藏用户 ID 这种事情用加密 session 最合适了..
为什么 request 对象会有一些 response 相关的方法
[39] pry(#<Nyara::SimpleController>)> request
=> #<Nyara::Request:0x007fcaaab59f38>
[40] pry(#<Nyara::SimpleController>)> request.response_header
=> {}
[41] pry(#<Nyara::SimpleController>)> request.response_content_type
=> nil
可以在 librelist上开个 list,问问题和订阅方便一些..
@luikore 看到别人从 erlang 转成 python 就知道团队内用 erlang 做稍微复杂的事情就悲剧了。 http://code.mixpanel.com/2011/08/05/how-and-why-we-switched-from-erlang-to-python/ 不知道有没有试过 python 的东西进行比较。 http://www.gevent.org/ 似乎挺多团队用的说。
Update: This repo is obsolete. The main point of event based IO is less memory for concurrent connections, and pay less time in CPU context switching, thus leading to higher performance benchmarks. But in real the heavy computation remains in ORMs like active record, the saved CPU time is insignificant while the implementation requires complex tweaks.
@luikore 可以再詳細解釋下嗎?